// 柯里化案例
function match (reg, str){
return str.match(reg)
}
  
//判断字符串是否有空白字符
const haveSpace = mathc(/\s+/g)
console.log(haveSpace('helloworld')) // null
console.log(haveSpace('hello world')) // [' ']

// 判断字符串是否有数字
const haveNumber = match(/\d+/g)
console.log(haveNumber('hello world')) // null

// filter纯函数转化成柯里化函数 => 改造成箭头函数 **
const filter = _.curry(function (fun, array){
    return array.filter(fun)
})
console.log(filter(haveSpace, ['John Connor', 'John_Donne']));

const findSpace = filter(haveSpace)




// 柯里化原理模拟

// 求和
function getSum (a, b, c){
    return a + b + c
  }
  
  const curried = _.curry(getSum)
  
  /*
  * 返回的函数再调用的时候需要接受参数
  * 而且接受参数的个数是不固定的 需要把所有参数全部获取到
  * 并且在函数内部判断一下传递的参数和getSum的形参个数是否相同
  * 可以用es6的剩余参数来实现 ...args
  * 实参和形参个数对比判断
  */
  function curry(func){
    return function curriedFn(...args){
      // 判断实参和形参的个数
      if( args.length < fun.length ){
        return function () {
          return curriedFn(...args.concat(Array.from(arguments)))
        }
      }
      return func(...args)
    }
  }
  

// 柯里化总结
//   柯里化可以让我们给一个函数传递较少的参数得到一个已经记住了某些固定参数的新函数
//   这是一种对函数参数的缓存-使用了闭包
//   让函数变得更灵活，让函数的粒度更小
//   可以把多元函数转换成一元函数，可以组合使用函数产生强大的功能


